package com.xiang._01;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * 排序比较: Comparator 与 Comparable
 *  区别:
 *      如果你有一个类，希望支持同类型的自定义比较策略，可以实现接口 Compareable (实现接口比较)
 *      如果某个类，没有实现 Compareable 接口，但是又希望对它进行比较，则可以自自定义一个Comparator ，来定义这个类的比较规则 （不实现接口，匿名比较）
 *
 */
public class SortTest {
    public static void main(String[] args) {



    }

    //1.实现了 Comparable 接口，因此可以直接调用list.sort(null) 或者 CollectionUtils.sort(list) 来进行比较
    public static class Demo implements Comparable<Demo>{
            int code;
            int age;

        public Demo(int code, int age) {
            this.code = code;
            this.age = age;
        }
        @Override
        public int compareTo(Demo o) {
            if (code == o.code) {
                return 0;
            } else if (code < o.code) {
                return -1;
            } else {
                return 1;
            }
        }

        @Override
        public String toString() {
            return "Demo{" +
                    "code=" + code +
                    ", age=" + age +
                    '}';
        }
    }


    //2.不实现接口，针对demo类的age字段
    public static void testDemoSort() {
        List<Demo> list = new ArrayList<>();
        list.add(new Demo(10, 30));
        list.add(new Demo(12, 10));
        list.add(new Demo(11, 20));
        // 默认根据 code 进行升序比较
        list.sort(null);
        System.out.println("sort by code: " + list);

        /**
         * o1 与 o2 比较，返回负数，则最终的结果中o1再前面（即升序排列）
         * 不要直接使用 o1-o2 会溢出，推荐使用 Integer.compare(o1, o2);
         *  list.sort(new Comparator<Demo>() {
         *      @Override
         *      public int compare(Demo o1, Demo o2) {
         *          return o1.age - o2.age;
         *      }
         *  });
         */
        // 不太美观
        list.sort((o1, o2) -> {
            if (o1.age == o2.age) {
                return 0;
            } else if (o1.age < o2.age) {
                return -1;
            } else {
                return 1;
            }
        });

        //基础类的 compare 方法
        list.sort((o1, o2) -> Integer.compare(o1.age, o2.age));


        //jdk1.8中，可以简化
        list.sort(Comparator.comparingInt(o -> o.age));

        System.out.println("sort by age: " + list);
    }

}
